%{
#include <iostream>
#include <string>

void yyerror(const char* msg)
{
    std::cout<< msg << std::endl;
}
extern int yylex();

void my_addone(const char* parm)
{
    int i = std::stoi(parm);
    std::cout<< i + 1 << std::endl;
}

void my_strcat(const char* s1, const char* s2)
{
    std::cout<< std::string(s1).append(s2) << std::endl;
}

void PrintPrompt(void)
{
    std::cout<< ">>";
}

%}

%union
{
    char parm[1024];
}

%token T_ADDONE
%token T_STRCAT
%token T_NEWLINE
%token  <parm> T_PARAMETER

%%
cmds:
        cmds cmd {}     //用这个规则处理换行
        |
        ;
cmd:    
        T_ADDONE T_PARAMETER
        {
            my_addone($2);
        }
        | T_STRCAT T_PARAMETER T_PARAMETER
        {
            my_strcat($2, $3);
        }
        | T_NEWLINE
        {
            PrintPrompt();
        }
        ;
%%

int main() {
    PrintPrompt();
    int ret;
    do
    {
        ret = yyparse();
    }while (0 != ret);

    std::cout<< "yyparse return " << ret << std::endl;
    return ret;
}